/**
 * 用 createConnection 创建 Mysql 连接，每执行一次 connection.query 都是一个全新的连接，会造成一个资源的极大浪费，降低性能。
 * 连接池是另外的一种执行方法，它一次性的创建了多个连接，然后根据客户端的查询，自动的 分发、复用、管理 这些连接。
 */
const mysql = require('mysql');
const DBCONFIG = require('../config/mysql').DBCONFIG;

/**
 * 链接池：创建多个链接、复用与分发链接
 */
const pool = mysql.createPool(DBCONFIG);

/**
 * [query description]
 * @return {[type]} [description]
 */
// 如果用户传递了两个参数，那么第一个就是 SQL 操作字符串， 第二个就是回调函数
// 如果是三个参数：第一个SQL字符串，第二个数组，第三个参数回调函数
exports.query = function() {
    let args = arguments;

    let sqlStr = args[0];           // sql 执行语句
    let params = [];                // sql 执行语句中 占位符的 参数
    let callback;                   // 回调函数

    if (args.length === 2 && typeof args[1] === 'function') {
        callback = args[1]
    } else if (args.length === 3 && Array.isArray(args[1]) && typeof args[2] === 'function') {
        params = args[1];
        callback  = args[2];
    } else {
        throw new Error("参数个数不匹配");
    }

    // 从连接池中取出连接。getConnection方法。如无连接可用则隐式的建立一个数据库连接。
    pool.getConnection(function(err, connection) { // 回调函数中的 err 为错误对象，connection 为获取到的连接对象。
        if (err) {
            callback(err);
            return;
        }
        // 随机分配一个连接
        connection.query(sqlStr, params, function(err, rows) {
            if (err) {
                callback(err);
                return;
            }
            // 当连接不再使用时，用connection对象的release方法将其归还到连接池中。connection.release();
            connection.release();
            callback.apply(null, arguments);
        });
    });
}